백그라운드에서의 setInterval

도서관 자리를 1초마다 조회하는 리액트앱을 만들어서 맥북에서 백그라운드로 동작시켰다. 하지만 어느순간 주기가 1분으로 늘어나는 것을 발견했다.
그래서 이 원인을 찾아보자!
Pasted image 20231024161438.png
범인은 바로 너!

원인 분석

먼저 setInterval의 작동의 문제라고 생각했기 때문에 관련 문서를 좀 뒤져봤따.
mdn web docs - setInterval
문서 내용 중 setInterval시 delay가 발생할 수 있는 여러가지 경우를 알려준다.

timeouts in inactive tabs 항목을 잘 살펴보자

Timeouts in inactive tabs

To reduce the load (and associated battery usage) from background tabs, browsers will enforce a minimum timeout delay in inactive tabs. It may also be waived if a page is playing sound using a Web Audio API AudioContext.
The specifics of this are browser-dependent:

요약하자면, 브라우저는 백그라운드의 리소스를 줄이기 위해 활성화되지 않은 탭에서의 minimum timeout을 1초로 정하고 있다고 한다.

잠깐, 나는 Electrone 웹앱을 사용중인데?

firefox와 chrome이 언급되고 있어서 얼른 electron 의 기반을 찾아봤는데, V8 ENGINE을 사용중이라고 한다.ㅜ
is Electron uses v8?

chrome 문서에서 좀 더 자세한 정책을 찾을 수 있었다.
https://developer.chrome.com/blog/background_tabs/

Chrome 57에서 제공되는 예산 기반 타이머 조절은 타이머 정렬 메커니즘을 더욱 확장하여 백그라운드 타이머 CPU 사용량에 추가 제한을 둡니다. 다음과 같이 작동합니다:

해결

여러가지 방법이 있을 것 같다.
그 중 webworker라는 방법으로 해결했다.
webworker란 : Web Worker
webworker in react : React에서 WebWorker사용하기

references